using System;
using System.Collections.Generic;
using igather.Framework;
using igather.Framework.Clustering;

namespace igather.Clustering
{
	/// <summary>
	/// Interface for an object that can separate a graph into clusters
	/// </summary>
  	public interface IClusteringEngine
  	{
		/// <summary>
		/// Separates a graph into clusters
		/// </summary>
		/// <param name="g">
		/// The graph to separate into clusters
		/// </param>
		/// <returns>
		/// A list of clusters
		/// </returns>
		ClusteredGraph GetClusters(IGraph g);

		/// <summary>
		/// When the difference in the metrics become smaller than this value from one iteration to another, the algorithm stops
	    /// Set to 0 to ignore this property
		/// </summary>
		double Precision { get; set; }

		/// <summary>
		/// The number of iterations this engine should perform before stopping
	    /// Set to 0 to ignore this property
		/// </summary>
		uint Loops { get; set; }

		/// <summary>
		/// The number of clusters expected after this engine runs
	    /// Set to 0 to ignore this property
		/// </value>
		uint K { get; set; }
	}
}
